home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume10 / logo / part04 < prev    next >
Encoding:
Internet Message Format  |  1987-06-23  |  21.5 KB

  1. Path: uunet!rs
  2. From: rs@uunet.UU.NET (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v10i024: Logo interpreter for Unix, Part04/06
  5. Message-ID: <450@uunet.UU.NET>
  6. Date: 24 Jun 87 20:21:53 GMT
  7. Organization: UUNET Communications Services, Arlington, VA
  8. Lines: 894
  9. Approved: rs@uunet.uu.net
  10.  
  11. Submitted by: Brian Harvey <bh@mit-amt>
  12. Mod.Sources: Volume 10, Number 24
  13. Archive-Name: logo/Part04
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 4 (of 6)."
  22. # Contents:  logo.y
  23. # Wrapped by rsalz@pineapple.bbn.com on Wed Jun 24 14:26:59 1987
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f logo.y -a "${1}" != "-c" ; then 
  26.   echo shar: Will not over-write existing file \"logo.y\"
  27. else
  28. echo shar: Extracting \"logo.y\" \(19535 characters\)
  29. sed "s/^X//" >logo.y <<'END_OF_logo.y'
  30. X
  31. X%nonassoc LOWPREC
  32. X%nonassoc '<' '>' '='
  33. X%left '+' '-'
  34. X%left '*' '/' '\\'
  35. X%left '^'
  36. X%left UNARY
  37. X%token TWOOP ONEOP NOOP ONECOM
  38. X%token CSTRING UINT
  39. X%token LTO IFCOM LEDIT LIFTF LTRACE
  40. X%token LPROC LPEND LAEND LGO
  41. X%token CLIST TWOCOM NOCOM
  42. X%token RUNCOM RNEND REPCOM THREECOM
  43. X%{ 
  44. X#include "logo.h"
  45. X
  46. Xchar popname[NAMELEN+1];
  47. Xint multnum;
  48. Xstruct object *multarg = 0;
  49. X#include <setjmp.h>
  50. Xextern jmp_buf runret;
  51. Xjmp_buf yerrbuf;
  52. Xint catching = 0;
  53. Xint flagquit = 0;
  54. Xextern struct runblock *thisrun;
  55. X#ifndef NOTURTLE
  56. Xextern int turtdes;
  57. Xextern struct display *mydpy;
  58. X#endif
  59. Xint errtold = 0;
  60. Xint yyline =0;
  61. Xchar ibuf[IBUFSIZ] ={0};
  62. Xchar *ibufptr =NULL;
  63. Xchar *getbpt =0;
  64. Xchar titlebuf[100] ={0};
  65. Xchar *titleptr =NULL;
  66. Xextern char *cpystr();
  67. Xint letflag =0;
  68. Xint topf =0;
  69. Xint pflag =0;
  70. Xchar charib =0;
  71. Xint endflag =0, rendflag = 0;
  72. Xint traceflag =0;
  73. Xint currtest = 0;
  74. Xint argno =(-1);
  75. Xint *stkbase =NULL;
  76. Xint stkbi =0;
  77. Xstruct stkframe *fbr =NULL;
  78. Xstruct plist *proclist =NULL;
  79. X#ifdef PAUSE
  80. Xint pauselev = 0;
  81. Xextern int psigflag,errpause;
  82. X#endif
  83. X
  84. Xstruct object *add(), *sub(), *mult(), *div(), *rem(), *and(), *or();
  85. Xstruct object *greatp(), *lessp(), *lmax(), *lmin(), *lis();
  86. Xstruct object *worcat(), *sencat(), *equal(), *lemp(), *comp();
  87. Xstruct object *lnump(), *lsentp(), *lwordp(), *length(), *zerop();
  88. Xstruct object *first(), *butfir(), *last(), *butlas(), *alllk();
  89. Xstruct object *lnamep(), *lrandd(), *rnd(), *sq(), *lpow(), *lsin();
  90. Xstruct object *lcos(), *latan(), *ltime(), *request(), *readlist();
  91. Xstruct object *cmprint(), *cmtype(), *cmoutput(), *lsleep(), *lbreak();
  92. Xstruct object *cmlocal(), *assign(), *cmedit(), *lstop(), *show(), *erase();
  93. Xstruct object *help(), *describe(), *ltrace(), *luntrace(), *lbyecom();
  94. Xstruct object *sometrace();
  95. X#ifndef NOTURTLE
  96. Xstruct object *getturtle(), *forward(), *back();
  97. Xstruct object *left(), *right(), *penup(), *cmpendown(), *clearscreen();
  98. Xstruct object *fullscreen(), *splitscreen(), *showturtle();
  99. Xstruct object *hideturtle(), *textscreen(), *cmpenerase(), *pencolor();
  100. Xstruct object *wipeclean(), *penmode(), *penreverse(), *shownp(), *towardsxy();
  101. Xstruct object *setcolor(), *setxy(), *setheading();
  102. Xstruct object *xcor(), *ycor(), *heading(), *getpen();
  103. Xstruct object *scrunch(), *setscrunch();
  104. X#endif
  105. Xstruct object *ltopl(), *cmfprint(), *cmftype(), *pots(), *fput(), *lput();
  106. Xstruct object *list(), *loread(), *lowrite(), *fileclose(), *cbreak();
  107. Xstruct object *lfread(), *lfword(), *fileprint(), *filefprint();
  108. Xstruct object *filetype(), *fileftype(), *callunix(), *repcount();
  109. X#ifdef DEBUG
  110. Xstruct object *setdebquit(), *setmemtrace(), *setyaccdebug();
  111. X#endif
  112. Xstruct object *readchar(), *keyp(), *intpart(), *round(), *toascii();
  113. Xstruct object *tochar(), *loflush(), *settest(), *memberp(), *item();
  114. X#ifdef PAUSE
  115. Xstruct object *unpause(), *dopause(), *setipause(), *setqpause(); /* PAUSE */
  116. Xstruct object *seterrpause(), *clrerrpause();
  117. X#endif
  118. X#ifdef FLOOR
  119. Xstruct object *hitoot(), *lotoot(), *lampon(), *lampoff();
  120. Xstruct object *ftouch(), *btouch(), *ltouch(), *rtouch();
  121. X#endif
  122. X#ifndef SMALL
  123. Xstruct object *gprop(), *plist(), *pps(), *remprop();
  124. X#endif
  125. X#ifdef SETCURSOR
  126. Xstruct object *clrtxt(), *setcur();
  127. X#endif
  128. X
  129. Xstruct lexstruct keywords[] =
  130. X{
  131. X    "sum",TWOOP,add,NULL,
  132. X    "difference",TWOOP,sub,"diff",
  133. X    "product",TWOOP,mult,NULL,
  134. X    "quotient",TWOOP,div,NULL,
  135. X    "remainder",TWOOP,rem,"mod",
  136. X    "both",TWOOP,and,"and",
  137. X    "either",TWOOP,or,"or",
  138. X    "greaterp",TWOOP,greatp,NULL,
  139. X    "lessp",TWOOP,lessp,NULL,
  140. X    "maximum",TWOOP,lmax,"max",
  141. X    "minimum",TWOOP,lmin,"min",
  142. X    "is",TWOOP,lis,NULL,
  143. X    "word",TWOOP,worcat,NULL,
  144. X    "sentence",TWOOP,sencat,"se",
  145. X    "equalp",TWOOP,equal,NULL,
  146. X    "emptyp",ONEOP,lemp,NULL,
  147. X    "not",ONEOP,comp,NULL,
  148. X    "numberp",ONEOP,lnump,NULL,
  149. X    "sentencep",ONEOP,lsentp,NULL,
  150. X    "wordp",ONEOP,lwordp,NULL,
  151. X    "count",ONEOP,length,NULL,
  152. X    "zerop",ONEOP,zerop,NULL,
  153. X    "first",ONEOP,first,NULL,
  154. X    "butfirst",ONEOP,butfir,"bf",
  155. X    "last",ONEOP,last,NULL,
  156. X    "butlast",ONEOP,butlas,"bl",
  157. X    "thing",ONEOP,alllk,NULL,
  158. X    "namep",ONEOP,lnamep,NULL,
  159. X    "random",ONEOP,rnd,"rnd",
  160. X    "sqrt",ONEOP,sq,NULL,
  161. X    "pow",TWOOP,lpow,NULL,
  162. X    "sin",ONEOP,lsin,NULL,
  163. X    "cos",ONEOP,lcos,NULL,
  164. X    "arctan",ONEOP,latan,"atan",
  165. X    "time",NOOP,ltime,NULL,
  166. X    "request",NOOP,request,NULL,
  167. X    "readlist",NOOP,readlist,"rl",
  168. X    "print",ONECOM,cmprint,"pr",
  169. X    "type",ONECOM,cmtype,NULL,
  170. X    "output",ONECOM,cmoutput,"op",
  171. X    "wait",ONECOM,lsleep,NULL,
  172. X    "local",ONECOM,cmlocal,NULL,
  173. X    "make",TWOCOM,assign,NULL,
  174. X    "if",IFCOM,0,NULL,
  175. X    "to",LTO,0,NULL,
  176. X    "end",LPEND,0,NULL,
  177. X    "stop",NOCOM,lstop,NULL,
  178. X    "break",NOCOM,lbreak,NULL,
  179. X    "edit",LEDIT,cmedit,"ed",
  180. X    "go",LGO,0,NULL,
  181. X    "show",ONECOM,show,"po",
  182. X    "erase",ONECOM,erase,"er",
  183. X    "help",NOCOM,help,NULL,
  184. X    "describe",ONECOM,describe,NULL,
  185. X    "trace",LTRACE,sometrace,NULL,
  186. X    "untrace",NOCOM,luntrace,NULL,
  187. X    "goodbye",NOCOM,lbyecom,"bye",
  188. X#ifndef NOTURTLE
  189. X    "turtle",ONECOM,getturtle,"tur",
  190. X    "forward",ONECOM,forward,"fd",
  191. X    "back",ONECOM,back,"bk",
  192. X    "left",ONECOM,left,"lt",
  193. X    "right",ONECOM,right,"rt",
  194. X#ifdef FLOOR
  195. X    "hitoot",ONECOM,hitoot,"hit",
  196. X    "lotoot",ONECOM,lotoot,"lot",
  197. X    "lampon",NOCOM,lampon,"lon",
  198. X    "lampoff",NOCOM,lampoff,"loff",
  199. X#endif
  200. X    "penup",NOCOM,penup,"pu",
  201. X    "pendown",NOCOM,cmpendown,"pd",
  202. X    "clearscreen",NOCOM,clearscreen,"cs",
  203. X    "fullscreen",NOCOM,fullscreen,"full",
  204. X    "splitscreen",NOCOM,splitscreen,"split",
  205. X    "showturtle",NOCOM,showturtle,"st",
  206. X    "hideturtle",NOCOM,hideturtle,"ht",
  207. X    "textscreen",NOCOM,textscreen,"text",
  208. X    "penerase",NOCOM,cmpenerase,"pe",
  209. X    "pencolor",ONECOM,pencolor,"penc",
  210. X    "setcolor",TWOCOM,setcolor,"setc",
  211. X    "setxy",TWOCOM,setxy,NULL,
  212. X    "setheading",ONECOM,setheading,"seth",
  213. X    "wipeclean",NOCOM,wipeclean,"clean",
  214. X    "penmode",NOOP,penmode,NULL,
  215. X    "penreverse",NOCOM,penreverse,"px",
  216. X    "shownp",NOOP,shownp,NULL,
  217. X    "towardsxy",TWOOP,towardsxy,NULL,
  218. X#ifdef FLOOR
  219. X    "ftouch",NOOP,ftouch,"fto",
  220. X    "btouch",NOOP,btouch,"bto",
  221. X    "ltouch",NOOP,ltouch,"lto",
  222. X    "rtouch",NOOP,rtouch,"rto",
  223. X#endif
  224. X    "xcor",NOOP,xcor,NULL,
  225. X    "ycor",NOOP,ycor,NULL,
  226. X    "heading",NOOP,heading,NULL,
  227. X    "getpen",NOOP,getpen,NULL,
  228. X    "scrunch",NOOP,scrunch,NULL,
  229. X    "setscrunch",ONECOM,setscrunch,"setscrun",
  230. X#endif
  231. X    "toplevel",NOCOM,ltopl,NULL,
  232. X    "fprint",ONECOM,cmfprint,"fp",
  233. X    "ftype",ONECOM,cmftype,"fty",
  234. X    "pots",NOCOM,pots,NULL,
  235. X    "fput",TWOOP,fput,NULL,
  236. X    "lput",TWOOP,lput,NULL,
  237. X    "list",TWOOP,list,NULL,
  238. X    "openread",ONEOP,loread,"openr",
  239. X    "openwrite",ONEOP,lowrite,"openw",
  240. X    "close",ONECOM,fileclose,NULL,
  241. X    "fileread",ONEOP,lfread,"fird",
  242. X    "fileword",ONEOP,lfword,"fiwd",
  243. X    "fileprint",TWOCOM,fileprint,"fip",
  244. X    "filefprint",TWOCOM,filefprint,"fifp",
  245. X    "filetype",TWOCOM,filetype,"fity",
  246. X    "fileftype",TWOCOM,fileftype,"fifty",
  247. X    "unix",ONECOM,callunix,NULL,
  248. X    "run",RUNCOM,0,NULL,
  249. X    "repeat",REPCOM,0,NULL,
  250. X    "repcount",NOOP,repcount,NULL,
  251. X#ifdef DEBUG
  252. X    "debquit",NOCOM,setdebquit,NULL,
  253. X    "memtrace",NOCOM,setmemtrace,NULL,
  254. X    "yaccdebug",NOCOM,setyaccdebug,NULL,
  255. X#endif
  256. X    "cbreak",ONECOM,cbreak,NULL,
  257. X    "readchar",NOOP,readchar,"rc",
  258. X    "keyp",NOOP,keyp,NULL,
  259. X    "int",ONEOP,intpart,NULL,
  260. X    "round",ONEOP,round,NULL,
  261. X    "ascii",ONEOP,toascii,NULL,
  262. X    "char",ONEOP,tochar,NULL,
  263. X    "oflush",NOCOM,loflush,NULL,
  264. X#ifndef SMALL
  265. X    "gprop",TWOOP,gprop,NULL,
  266. X    "plist",ONEOP,plist,NULL,
  267. X    "pprop",THREECOM,0,NULL,
  268. X    "pps",NOCOM,pps,NULL,
  269. X    "remprop",TWOCOM,remprop,NULL,
  270. X#endif
  271. X    "test",ONECOM,settest,NULL,
  272. X    "iftrue",LIFTF,(struct object *(*)())1,"ift",
  273. X    "iffalse",LIFTF,0,"iff",
  274. X    "memberp",TWOOP,memberp,NULL,
  275. X    "item",TWOOP,item,"nth",
  276. X#ifdef PAUSE
  277. X    "continue",NOCOM,unpause,"co",
  278. X    "pause",NOCOM,dopause,NULL,
  279. X    "setipause",NOCOM,setipause,NULL,
  280. X    "setqpause",NOCOM,setqpause,NULL,
  281. X    "errpause",NOCOM,seterrpause,NULL,
  282. X    "errquit",NOCOM,clrerrpause,NULL,
  283. X#endif
  284. X#ifdef SETCURSOR
  285. X    "cleartext",NOCOM,clrtxt,"ct",
  286. X    "setcursorxy",TWOCOM,setcur,"setcxy",
  287. X#endif
  288. X    NULL,NULL,NULL,NULL,
  289. X};
  290. X
  291. X#define uperror {errtold++;YYERROR;}
  292. X
  293. X#ifdef PAUSE
  294. X#define catch(X) {if(!setjmp(yerrbuf)){if(flagquit)errhand();catching++;X;catching=0;}else{catching=0;uperror}}
  295. X#else
  296. X#define catch(X) {X;}
  297. X#endif
  298. X%}
  299. X%%
  300. Xstart_sym :  |
  301. X     start_sym command  ={
  302. X        popname[0] = '\0';
  303. X#ifdef PAUSE
  304. X        if (psigflag) dopause();
  305. X#endif
  306. X        yyprompt(1);
  307. X    } |
  308. X    start_sym error ={
  309. X        popname[0] = '\0';
  310. X        if (!errtold) {
  311. X            logoyerror();
  312. X        }
  313. X        errtold = 0;
  314. X        errwhere();
  315. X#ifdef PAUSE
  316. X        if ((!errpause&&!pauselev) || !fbr)
  317. X#endif
  318. X            errzap();
  319. X        yyerrok;yyclearin;
  320. X        yyprompt(0);
  321. X    };
  322. Xcommand :
  323. X    LEDIT rnewline ={
  324. X        catch(doedit(););
  325. X        $$ = -1;
  326. X    } |
  327. X    LTRACE rnewline ={
  328. X        catch(ltrace(););
  329. X        $$ = -1;
  330. X    } |
  331. X    onecom valuearg newline ={
  332. X        catch($$=(int)(*keywords[$1].lexval)($2););} |
  333. X    onecom error ={notenf($1);uperror;} |
  334. X    TWOCOM valuearg valuearg newline ={
  335. X        catch((*keywords[$1].lexval)($2,$3);); $$ = -1;} |
  336. X    TWOCOM error ={notenf($1);uperror;} |
  337. X    THREECOM valuearg valuearg valuearg newline ={
  338. X#ifndef SMALL
  339. X        catch(pprop($2,$3,$4););
  340. X#endif
  341. X        $$ = -1;
  342. X    } |
  343. X    THREECOM error ={
  344. X        if (!errtold) {
  345. X            puts("Not enough inputs to pprop.");
  346. X        }
  347. X        uperror;
  348. X    } |
  349. X    rnewline ={ $$= -1; } |
  350. X    NOCOM newline ={
  351. X        catch((*keywords[$1].lexval)();); $$= -1;} |
  352. X    LGO white3 valuearg newline ={
  353. X        catch(go($3););
  354. X        $$= -1;
  355. X        } |
  356. X    LGO error ={notenf($1);uperror;} |
  357. X    ifcall ={
  358. X        if (($1 != -1) && !endflag) {
  359. X            if (!errtold)
  360. X                pf1("You don't say what to do with %l.\n",$1);
  361. X            uperror;
  362. X        }
  363. X        $$ = $1;
  364. X    } |
  365. X    title ={
  366. X        if ($1== -1)
  367. X            uperror
  368. X        else
  369. X            catch(proccreate($1););
  370. X            $$ = -1;
  371. X    } |
  372. X    arg newline {
  373. X        if (thisrun && !pflag) {
  374. X            $$ = $1;
  375. X        } else {
  376. X            if(($1 != -1) && !endflag) {
  377. X                if (!errtold)
  378. X                    pf1("You don't say what to do with %l\n",$1);
  379. X                uperror;
  380. X            }
  381. X        }
  382. X    } ;
  383. X
  384. Xonecom : ONECOM | LEDIT | LTRACE ;
  385. X
  386. Xvaluearg:    userarg ={
  387. X            if ($1 == -1) {
  388. X                if (!errtold) {
  389. X                    printf("%s didn't output.\n",
  390. X                        popname);
  391. X                }
  392. X                uperror;
  393. X            }
  394. X        } |
  395. X        sysarg ;
  396. X
  397. Xlabint : UINT %prec UNARY ={ yyline=((struct object *)$1)->obint; mfree($1); $$ = 0;};
  398. X
  399. Xarg :    userarg | sysarg ;
  400. X
  401. Xuserarg : proccall %prec UNARY |
  402. X    runcall %prec LOWPREC ;
  403. X
  404. Xsysarg : TWOOP valuearg valuearg %prec LOWPREC ={
  405. X        catch($$=(int)(*keywords[$1].lexval)($2,$3););
  406. X    } |
  407. X    TWOOP valuearg error %prec LOWPREC ={op2er1($1,$2);uperror;} |
  408. X    TWOOP error %prec LOWPREC ={notenf($1);uperror;} |
  409. X    ONEOP valuearg %prec LOWPREC ={
  410. X        catch($$=(int)(*keywords[$1].lexval)($2););
  411. X    } |
  412. X    ONEOP error %prec LOWPREC ={notenf($1);uperror;} |
  413. X    NOOP %prec LOWPREC ={
  414. X        catch($$=(int)(*keywords[$1].lexval)(););
  415. X    } |
  416. X    UINT %prec LOWPREC |
  417. X    '\"' CSTRING { $$=$2; } |
  418. X    '[' CLIST ']' { $$=$2; } |
  419. X    ':' CSTRING {
  420. X        catch($$=(int)alllk($2););
  421. X        } |
  422. X    valuearg '+' valuearg ={
  423. X        catch($$=(int)add($1,$3););
  424. X    } |
  425. X    valuearg '+' error ={inferr($1,$2);uperror;} |
  426. X    valuearg '-' valuearg ={
  427. X        catch($$=(int)sub($1,$3););
  428. X    } |
  429. X    valuearg '-' error ={inferr($1,$2);uperror;} |
  430. X    '-' valuearg %prec UNARY ={
  431. X        catch($$=(int)opp($2););
  432. X    } |
  433. X    '-' error %prec UNARY ={unerr('-');uperror;} |
  434. X    valuearg '^' valuearg {
  435. X        catch($$=(int)lpow($1,$3););
  436. X    } |
  437. X    valuearg '^' error { inferr($1,$2);uperror; } |
  438. X    valuearg '*' valuearg ={
  439. X        catch($$=(int)mult($1,$3););
  440. X    } |
  441. X    valuearg '*' error ={inferr($1,$2);uperror;} |
  442. X    valuearg '/' valuearg ={
  443. X        catch($$=(int)div($1,$3););
  444. X    } |
  445. X    valuearg '/' error ={inferr($1,$2);uperror;} |
  446. X    valuearg '\\' valuearg ={
  447. X        catch($$=(int)rem($1,$3););
  448. X    } |
  449. X    valuearg '\\' error ={inferr($1,$2);uperror;} |
  450. X    valuearg '=' valuearg ={
  451. X        catch($$=(int)equal($1,$3);)
  452. X    } |
  453. X    valuearg '=' error ={inferr($1,$2);uperror;} |
  454. X    valuearg '<' valuearg ={
  455. X        catch($$=(int)lessp($1,$3););
  456. X    } |
  457. X    valuearg '<' error ={inferr($1,$2);uperror;} |
  458. X    valuearg '>' valuearg ={
  459. X        catch($$=(int)greatp($1,$3););
  460. X    } |
  461. X    valuearg '>' error ={inferr($1,$2);uperror;} |
  462. X    '{' TWOOP oparglist rbrak {
  463. X        catch($$=multiop($2,globcopy(multarg)););
  464. X        lfree(multarg);
  465. X        multarg = 0;
  466. X    }|
  467. X    '(' TWOOP oparglist rbrak {
  468. X        catch($$=multiop($2,globcopy(multarg)););
  469. X        lfree(multarg);
  470. X        multarg = 0;
  471. X    }|
  472. X    '(' valuearg rbrak ={$$=$2;} ;
  473. X
  474. Xoparglist : valuearg ={
  475. X        catch(multarg = globcons($1,0););
  476. X        mfree($1);
  477. X        multnum = 1;
  478. X    } |
  479. X    valuearg oparglist ={
  480. X        catch(multarg = globcons($1,multarg););
  481. X        mfree($1);
  482. X        multnum++;
  483. X    };
  484. Xtitle : tbegin varlist '\n' ={
  485. X        strcpy(titleptr,"\n");
  486. X        $$=$1;
  487. X    } |
  488. X    tbegin '\n' ={
  489. X        strcpy(titleptr,"\n");
  490. X        $$=$1;
  491. X    } |
  492. X    tbegin varlist error ={
  493. X        mfree($1);
  494. X        terr();
  495. X        $$= -1;
  496. X    } |
  497. X    tbegin error ={
  498. X        mfree($1);
  499. X        terr();
  500. X        $$= -1;
  501. X    };
  502. Xtbegin : LTO LPROC ={
  503. X        titleptr=cpystr(titlebuf,"to ",
  504. X            ((struct object *)($2))->obstr,NULL);
  505. X        $$=$2;
  506. X    } | 
  507. X    LTO primitive ={
  508. X        if (!errtold) printf("Can't redefine primitive %s\n",
  509. X            keywords[$2].word);
  510. X        uperror;
  511. X    };
  512. Xprimitive : NOOP | ONEOP | TWOOP | NOCOM | ONECOM | TWOCOM | THREECOM
  513. X        | IFCOM | LTO | LEDIT | LIFTF | LGO
  514. X        | RUNCOM | REPCOM | LPEND ;
  515. Xvarlist : varsyn ={titleptr=cpystr(titleptr," :",
  516. X            ((struct object *)($1))->obstr,NULL);
  517. X        mfree($1);
  518. X    } |
  519. X    varlist varsyn {titleptr=cpystr(titleptr," :",
  520. X            ((struct object *)($2))->obstr,NULL);
  521. X        mfree($2);
  522. X    } ;
  523. Xvarsyn : ':' CSTRING {$$=$2;};
  524. Xproccall : procname args argend commlist procend ={
  525. X        $$=$4;
  526. X        frmpop($4);
  527. X    } |
  528. X    procname error ={
  529. X        if (!errtold) printf("Not enough inputs to %s\n",
  530. X            proclist->procname->obstr);
  531. X        uperror;
  532. X    };
  533. Xargs: |    arglist;
  534. Xarglist : valuearg %prec LOWPREC ={
  535. X        catch(argassign($1););
  536. X    } |
  537. X    arglist valuearg %prec LOWPREC ={
  538. X        catch(argassign($2););
  539. X    } ;
  540. Xargend : LAEND ={procprep();};
  541. Xcommlist : ={yyline=1; $$ = -1;} |
  542. X    commlist labint command ={
  543. X        popname[0] = '\0';
  544. X#ifdef PAUSE
  545. X        if (psigflag) dopause();
  546. X        if (thisrun && thisrun->str == (struct object *)(-1))
  547. X            yyprompt(1);
  548. X#endif
  549. X        $$=$3;
  550. X    } |
  551. X    commlist command ={
  552. X        popname[0] = '\0';
  553. X        if (pflag) yyline++;
  554. X#ifdef PAUSE
  555. X        if (psigflag) dopause();
  556. X        if (thisrun && thisrun->str == (struct object *)(-1))
  557. X            yyprompt(1);
  558. X#endif
  559. X        $$=$2;
  560. X    } |
  561. X    commlist error ={
  562. X        popname[0] = '\0';
  563. X#ifdef PAUSE
  564. X        if ((!errpause&&!pauselev) || !fbr)
  565. X#endif
  566. X            uperror;
  567. X#ifdef PAUSE
  568. X        if (!errtold) {
  569. X            logoyerror();
  570. X        }
  571. X        errtold = 0;
  572. X        errwhere();
  573. X        yyerrok;yyclearin;
  574. X        if (thisrun && thisrun->str == (struct object *)(-1))
  575. X            yyprompt(0);
  576. X#endif
  577. X    };
  578. Xprocend : LPEND |
  579. X    labint LPEND ;
  580. Xprocname : LPROC ={
  581. X        catch(newproc($1););
  582. X    };
  583. Xrcommlist : ={$$ = -1;} |
  584. X    rcommlist command ={
  585. X        popname[0] = '\0';
  586. X#ifdef PAUSE
  587. X        if (psigflag) dopause();
  588. X        if (thisrun && thisrun->str == (struct object *)(-1))
  589. X            yyprompt(1);
  590. X#endif
  591. X        $$=$2;
  592. X    } |
  593. X    rcommlist error ={
  594. X        popname[0] = '\0';
  595. X#ifdef PAUSE
  596. X        if ((!errpause&&!pauselev) || !fbr)
  597. X#endif
  598. X            uperror;
  599. X#ifdef PAUSE
  600. X        if (!errtold) {
  601. X            logoyerror();
  602. X        }
  603. X        errtold = 0;
  604. X        errwhere();
  605. X        yyerrok;yyclearin;
  606. X        if (thisrun && thisrun->str == (struct object *)(-1))
  607. X            yyprompt(0);
  608. X#endif
  609. X    };
  610. Xruncall : realrun | reprun | ifrun ;
  611. Xrealrun : runstart rcommlist runend ={
  612. X        unrun();
  613. X        $$ = $2;
  614. X        strcpy(popname,"run");
  615. X    };
  616. Xreprun : reprstart rcommlist runend ={
  617. X        unrun();
  618. X        $$ = $2;
  619. X        strcpy(popname,"repeat");
  620. X    };
  621. Xifrun : ifrstart rcommlist runend ={
  622. X        unrun();
  623. X        $$ = $2;
  624. X        strcpy(popname,"if");
  625. X    };
  626. Xrunstart : RUNCOM valuearg %prec LOWPREC ={
  627. X        catch(dorun($2,(FIXNUM)0););
  628. X    } ;
  629. Xreprstart : REPCOM valuearg valuearg %prec LOWPREC ={
  630. X        catch(dorep($2,$3););
  631. X    } ;
  632. Xifrstart : IFCOM valuearg valuearg valuearg %prec LOWPREC ={
  633. X        {
  634. X            int i;
  635. X
  636. X            catch(i = truth($2););
  637. X            if (i) {
  638. X                catch(dorun($3,(FIXNUM)0););
  639. X                mfree($4);
  640. X            } else {
  641. X                catch(dorun($4,(FIXNUM)0););
  642. X                mfree($3);
  643. X            }
  644. X        }
  645. X    } |
  646. X    IFCOM error ={
  647. X        if (!errtold) printf("Not enough inputs to if.\n");
  648. X        uperror;
  649. X    } ;
  650. Xrunend : RNEND;
  651. Xifcall : ifstart rcommlist runend ={
  652. X        unrun();
  653. X        $$ = $2;
  654. X    };
  655. Xifstart : IFCOM valuearg valuearg rnewline ={
  656. X        {
  657. X            int i;
  658. X
  659. X            catch(i = truth($2););
  660. X            if (i) {catch(dorun($3,(FIXNUM)0););}
  661. X            else {
  662. X                catch(dorun(0,(FIXNUM)0););
  663. X                mfree($3);
  664. X            }
  665. X        }
  666. X    } |
  667. X    LIFTF valuearg newline ={
  668. X        if ((int)keywords[$1].lexval==currtest) {
  669. X            catch(dorun($2,(FIXNUM)0););
  670. X        } else {
  671. X            catch(dorun(0,(FIXNUM)0););
  672. X            mfree($2);
  673. X        }
  674. X    } ;
  675. Xwhite3 : | LTO ;
  676. Xrbrak : '}' | ')' ;
  677. Xnewline    : '\n' | ';' | ;
  678. Xrnewline : '\n' | ';' ;
  679. X%%
  680. X
  681. Xextern struct object *makelist();
  682. X
  683. X#ifdef PAUSE
  684. Xyylex1()
  685. X#else
  686. Xyylex()
  687. X#endif
  688. X{
  689. X    register char *str;
  690. X    char s[100];
  691. X    char c;
  692. X    register pc;
  693. X    register i;
  694. X    NUMBER dubl;
  695. X    int floatflag;
  696. X    FIXNUM fixn;
  697. X
  698. X    if (yyerrflag) return(1);
  699. X    else if (argno==0 && pflag!=1) {
  700. X        if (fbr->oldyyc==-2) fbr->oldyyc= -1;
  701. X        return(LAEND);
  702. X    } else if (endflag==1 && pflag>1) {
  703. X        endflag=0;
  704. X        return(LPEND);
  705. X    }
  706. X    else if (pflag==2) {
  707. X        pc= *(stkbase+stkbi++);
  708. X        if (stkbi==PSTKSIZ-1) {
  709. X            stkbase= (int *)(*(stkbase+PSTKSIZ-1));
  710. X            stkbi=1;
  711. X        }
  712. X        yylval= *(stkbase+stkbi++);
  713. X        if (pc==LPROC || pc==CSTRING || pc==UINT || pc==CLIST) {
  714. X            yylval=(int)localize((struct object *)yylval);
  715. X        }
  716. X        if (stkbi==PSTKSIZ-1) {
  717. X            stkbase= (int *)(*(stkbase+PSTKSIZ-1));
  718. X            stkbi=1;
  719. X        }
  720. X        if (pc== -1) return(0);
  721. X        else return(pc);
  722. X    } else if (letflag==1) {
  723. X        str=s;
  724. X        while (!index(" \t\n[](){}\";",(c = getchar()))) {
  725. X            if (c == '\\') c = getchar() /* |0200 */ ;
  726. X            else if (c == '%') c = ' ' /* |0200 */ ;
  727. X            *str++ = c;
  728. X        }
  729. X        charib=c;
  730. X        *str='\0';
  731. X        yylval=(int)localize(objcpstr(s));
  732. X        letflag=0;
  733. X        return(CSTRING);
  734. X    } else if (letflag==2) {
  735. X        str = s;
  736. X        while (( (c=getchar())>='a' && c<='z' )
  737. X                || (c>='A' && c<='Z') || (c>='0' && c<='9')
  738. X                || (c=='.') || (c=='_') ) {
  739. X            if (c>='A' && c<='Z') c += 040;
  740. X            *str++ = c;
  741. X        }
  742. X        charib = c;
  743. X        *str = '\0';
  744. X        letflag = 0;
  745. X        yylval = (int)localize(objcpstr(s));
  746. X        return(CSTRING);
  747. X    }
  748. X    else if (letflag==3) {
  749. X        yylval = (int)makelist();
  750. X        letflag = 4;
  751. X        return(CLIST);
  752. X    }
  753. X    else if (letflag==4) {
  754. X        letflag = 0;
  755. X        return(yylval = getchar());
  756. X    }
  757. X    while ((c=getchar())==' ' || c=='\t')
  758. X        ;
  759. X    if (rendflag) {
  760. X        getbpt = 0;
  761. X        if (rendflag < 3)
  762. X            --rendflag;
  763. X        else if (!thisrun || thisrun->svpflag)
  764. X            rendflag = 0;
  765. X        return(RNEND);
  766. X    }
  767. X
  768. X    if (c == '!')    /* comment feature */
  769. X        while ((c=getchar()) && (c != '\n')) ;
  770. X
  771. X    if ((c<'a' || c>'z') && (c<'A' || c>'Z')
  772. X            && (c<'0' || c>'9') && c!='.') {
  773. X        yylval=c;
  774. X        if (c=='\"') letflag=1;
  775. X        if (c==':') letflag=2;
  776. X        if (c=='[') letflag=3;
  777. X        return(c);
  778. X    }
  779. X    else if ((c>='0' && c<='9')|| c=='.') {
  780. X        floatflag = (c=='.');
  781. X        str=s;
  782. X        while ((c>='0' && c<='9')||(c=='E')||(c=='e')||(c=='.')) {
  783. X            *str++=c;
  784. X            if (c=='.') floatflag++;
  785. X            if ((c=='e')||(c=='E')) {
  786. X                floatflag++;
  787. X                c = getchar();
  788. X                if ((c=='+')||(c=='-')) {
  789. X                    *str++ = c;
  790. X                    c = getchar();
  791. X                }
  792. X            } else c=getchar();
  793. X        }
  794. X        charib=c;
  795. X        *str='\0';
  796. X        if (floatflag) {
  797. X            sscanf(s,EFMT,&dubl);
  798. X            yylval=(int)localize(objdub(dubl));
  799. X        } else {
  800. X            sscanf(s,FIXFMT,&fixn);
  801. X            yylval=(int)localize(objint(fixn));
  802. X        }
  803. X        return(UINT);
  804. X    } else {
  805. X        if (c < 'a') c += 040;
  806. X        yylval=(int)(str=s);
  807. X        *str++=c;
  808. X        c=getchar();
  809. X        if (c >= 'A' && c <= 'Z') c += 040;
  810. X        while ((c>='a' && c<='z') || (c>='0' && c<='9')
  811. X                || (c=='.') || (c=='_')) {
  812. X            *str++=c;
  813. X            c=getchar();
  814. X            if (c >= 'A' && c <= 'Z') c += 040;
  815. X        }
  816. X        charib=c;
  817. X        *str='\0';
  818. X        for (i=0; keywords[i].word; i++) {
  819. X            if (!strcmp(yylval,keywords[i].word) ||
  820. X                 (keywords[i].abbr && 
  821. X                  !strcmp(yylval,keywords[i].abbr))) {
  822. X                yylval=i;
  823. X                return(keywords[i].lexret);
  824. X            }
  825. X        }
  826. X        yylval=(int)localize(objcpstr(s));
  827. X        return(LPROC);
  828. X    }
  829. X}
  830. X
  831. X#ifdef PAUSE
  832. Xyylex() {
  833. X    int x;
  834. X
  835. X    if (catching) return(yylex1());
  836. X    if (!setjmp(yerrbuf)) {
  837. X        if (flagquit) errhand();
  838. X        catching++;
  839. X        x = yylex1();
  840. X        catching=0;
  841. X        return(x);
  842. X    } else {
  843. X        catching=0;
  844. X        return(12345);    /* This should cause an error up there */
  845. X    }
  846. X}
  847. X#endif
  848. X
  849. Xint isuint(x)
  850. Xint x;
  851. X{
  852. X    return(x == UINT);
  853. X}
  854. X
  855. Xint isstored(x)
  856. Xint x;
  857. X{
  858. X    return(x==UINT || x==LPROC || x==CSTRING || x==CLIST);
  859. X}
  860. X
  861. Xyyprompt(clear) {
  862. X    register int i;
  863. X
  864. X    if (!ibufptr && !getbpt && !pflag) {
  865. X        flagquit = 0;
  866. X#ifdef PAUSE
  867. X        if (pauselev > 0) {
  868. X            for (i=pauselev; --i >=0; )
  869. X                putchar('-');
  870. X        }
  871. X#endif
  872. X        putchar('?');
  873. X#ifndef NOTURTLE
  874. X        if ((turtdes<0) && clear)
  875. X            (*mydpy->state)('*');
  876. X#endif
  877. X        fflush(stdout);
  878. X    }
  879. X}
  880. X
  881. END_OF_logo.y
  882. if test 19535 -ne `wc -c <logo.y`; then
  883.     echo shar: \"logo.y\" unpacked with wrong size!
  884. fi
  885. # end of overwriting check
  886. fi
  887. echo shar: End of archive 4 \(of 6\).
  888. cp /dev/null ark4isdone
  889. MISSING=""
  890. for I in 1 2 3 4 5 6 ; do
  891.     if test ! -f ark${I}isdone ; then
  892.     MISSING="${MISSING} ${I}"
  893.     fi
  894. done
  895. if test "${MISSING}" = "" ; then
  896.     echo You have unpacked all 6 archives.
  897.     echo "Now see the README"
  898.     rm -f ark[1-9]isdone
  899. else
  900.     echo You still need to unpack the following archives:
  901.     echo "        " ${MISSING}
  902. fi
  903. ##  End of shell archive.
  904. exit 0
  905.